﻿using System.Net.NetworkInformation;
using LinqKit;
using Shop.Model.DB;
using Shop.Model.ModuleGoods;
using Shop.RemoteModel.PageModuleGoods.Model;
using WeDonekRpc.Helper;
using WeDonekRpc.Helper.IdGenerator;
using WeDonekRpc.Model;
using WeDonekRpc.SqlSugar;

namespace Shop.Repository.lmpl
{
    internal class PageModuleGoodsRepository : ShopBaseRepository<DBPageModuleGoods, long>, IPageModuleGoodsRepository
    {
        public PageModuleGoodsRepository ( ISqlClientFactory factory ) : base(factory)
        {
        }
        public void SetSort ( Dictionary<long, int> sorts )
        {
            if ( !base.Update(sorts.ConvertAll(a => new DBPageModuleGoods
            {
                Id = a.Key,
                Sort = a.Value
            }), "Sort") )
            {
                throw new ErrorException("shop.page.module.goods.set.fail");
            }
        }
        public ModuleGoodsBase[] GetGoods ( long tModuleId, string tag )
        {
            if ( tag.IsNull() )
            {
                return base.Gets<ModuleGoodsBase>(a => a.TModuleId == tModuleId, a => a.Sort, SqlSugar.OrderByType.Asc);
            }
            return base.Gets<ModuleGoodsBase>(a => a.TModuleId == tModuleId && a.TagKey == tag, a => a.Sort, SqlSugar.OrderByType.Asc);
        }
        public long[] GetId ( long tModuleId, string tag )
        {
            if ( tag.IsNull() )
            {
                return base.Gets(a => a.TModuleId == tModuleId, a => a.Id);
            }
            return base.Gets(a => a.TModuleId == tModuleId && a.TagKey == tag, a => a.Id);
        }
        public long[] GetGoodsId ( long moduleId, string tag, int top )
        {
            if ( tag.IsNull() )
            {
                return base.GetTops(a => a.TModuleId == moduleId, a => a.GoodsId, top, "Sort");
            }
            return base.GetTops(a => a.TModuleId == moduleId && a.TagKey == tag, a => a.GoodsId, top, "Sort");
        }
        public ModuleGoodsBase[] Sync ( ModuleGoodsAdd add, long[] dropId )
        {
            DBPageModuleGoods[] adds = add.GoodsId.ConvertAll(( c, i ) => new DBPageModuleGoods
            {
                Id = IdentityHelper.CreateId(),
                GoodsId = c,
                Sort = i + 1,
                TagKey = add.TagKey,
                TemplateId = add.TemplateId,
                TModuleId = add.TModuleId
            });
            if ( dropId.IsNull() )
            {
                base.Insert(adds);
            }
            else
            {
                ISqlQueue<DBPageModuleGoods> queue = base.BeginQueue();
                queue.Delete(a => dropId.Contains(a.Id));
                queue.Insert(adds);
                _ = queue.Submit();
            }
            return adds.ConvertAll(a => new ModuleGoodsBase
            {
                GoodsId = a.GoodsId,
                Id = a.Id,
                Sort = a.Sort
            });
        }
       
        public long[] Query ( long moduleId, string tag, IBasicPage paging, out int count )
        {
            paging.InitOrderBy("Sort", false);
            if ( tag.IsNull() )
            {
                return base.Query<long>(a => a.TModuleId == moduleId,  a => a.GoodsId, paging, out count);
            }
            return base.Query<long>(a => a.TModuleId == moduleId && a.TagKey == tag, a => a.GoodsId, paging, out count);
        }
    }
}
